package org.dromara.datacheck.service.impl.jd;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.datacheck.domain.bo.jd.JdSaleReturnOrderBo;
import org.dromara.datacheck.domain.jd.JdSaleReturnOrder;
import org.dromara.datacheck.domain.vo.jd.JdSaleReturnOrderVo;
import org.dromara.datacheck.mapper.jd.JdSaleReturnOrderMapper;
import org.dromara.datacheck.service.jd.IJdSaleReturnOrderService;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 金蝶-销售退货单Service业务层处理
 *
 * @author 刘武贵
 * @date 2024-09-08
 */
@RequiredArgsConstructor
@Service
public class JdSaleReturnOrderServiceImpl implements IJdSaleReturnOrderService {

    private final JdSaleReturnOrderMapper baseMapper;

    /**
     * 查询金蝶-销售退货单
     *
     * @param id 主键
     * @return 金蝶-销售退货单
     */
    @Override
    public JdSaleReturnOrderVo queryById(Long id){
        return baseMapper.selectVoById(id);
    }

    /**
     * 分页查询金蝶-销售退货单列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 金蝶-销售退货单分页列表
     */
    @Override
    public TableDataInfo<JdSaleReturnOrderVo> queryPageList(JdSaleReturnOrderBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<JdSaleReturnOrder> lqw = buildQueryWrapper(bo);
        Page<JdSaleReturnOrderVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }

    /**
     * 查询符合条件的金蝶-销售退货单列表
     *
     * @param bo 查询条件
     * @return 金蝶-销售退货单列表
     */
    @Override
    public List<JdSaleReturnOrderVo> queryList(JdSaleReturnOrderBo bo) {
        LambdaQueryWrapper<JdSaleReturnOrder> lqw = buildQueryWrapper(bo);
        return baseMapper.selectVoList(lqw);
    }

    /**
     * 构建查询包装器
     * 该方法用于根据业务对象（bo）中的属性值生成一个LambdaQueryWrapper对象，这个对象后续用于数据库查询时的条件筛选
     * 主要用于销售退货单相关查询的条件构建
     *
     * @param bo 业务对象，包含查询条件相关的属性以及动态参数
     * @return LambdaQueryWrapper<JdSaleReturnOrder> 查询包装器对象，用于数据库查询时的条件构造
     */
    private LambdaQueryWrapper<JdSaleReturnOrder> buildQueryWrapper(JdSaleReturnOrderBo bo) {
        // 获取动态参数，用于处理额外的查询条件或配置
        Map<String, Object> params = bo.getParams();

        // 初始化LambdaQueryWrapper对象，用于构建查询条件
        LambdaQueryWrapper<JdSaleReturnOrder> lqw = Wrappers.lambdaQuery();

        // 以下为一系列查询条件的构建，只有当属性值不为空时，才会添加等于（eq）条件
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnOrderDate()), JdSaleReturnOrder::getSaleReturnOrderDate, bo.getSaleReturnOrderDate());
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnOrderNumber()), JdSaleReturnOrder::getSaleReturnOrderNumber, bo.getSaleReturnOrderNumber());
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnOrderStatus()), JdSaleReturnOrder::getSaleReturnOrderStatus, bo.getSaleReturnOrderStatus());
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnCustomer()), JdSaleReturnOrder::getSaleReturnCustomer, bo.getSaleReturnCustomer());
        lqw.eq(StringUtils.isNotBlank(bo.getInventoryOrganize()), JdSaleReturnOrder::getInventoryOrganize, bo.getInventoryOrganize());
        lqw.eq(StringUtils.isNotBlank(bo.getMaterialCode()), JdSaleReturnOrder::getMaterialCode, bo.getMaterialCode());

        // 当属性值不为空时，添加类似（like）条件，用于模糊查询
        lqw.like(StringUtils.isNotBlank(bo.getMaterialName()), JdSaleReturnOrder::getMaterialName, bo.getMaterialName());
        lqw.like(StringUtils.isNotBlank(bo.getInventoryUnitName()), JdSaleReturnOrder::getInventoryUnitName, bo.getInventoryUnitName());

        // 处理数值类型属性，只要属性值不为null，就添加等于（eq）条件
        lqw.eq(bo.getActualReturnNumber() != null, JdSaleReturnOrder::getActualReturnNumber, bo.getActualReturnNumber());

        // 继续处理其他字符串类型属性，添加等于（eq）或类似（like）条件
        lqw.eq(StringUtils.isNotBlank(bo.getReturnType()), JdSaleReturnOrder::getReturnType, bo.getReturnType());
        lqw.like(StringUtils.isNotBlank(bo.getWarehouseName()), JdSaleReturnOrder::getWarehouseName, bo.getWarehouseName());
        if (params.get("beginTime") != null && params.get("endTime") != null) {
            lqw.between(JdSaleReturnOrder::getNewOrderDate,
                params.get("beginTime"),
                params.get("endTime"));
        }
        // 返回构建好的查询包装器对象
        return lqw;
    }


    /**
     * 新增金蝶-销售退货单
     *
     * @param bo 金蝶-销售退货单
     * @return 是否新增成功
     */
    @Override
    public Boolean insertByBo(JdSaleReturnOrderBo bo) {
        JdSaleReturnOrder add = MapstructUtils.convert(bo, JdSaleReturnOrder.class);
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setId(String.valueOf(add.getId()));
        }
        return flag;
    }

    /**
     * 修改金蝶-销售退货单
     *
     * @param bo 金蝶-销售退货单
     * @return 是否修改成功
     */
    @Override
    public Boolean updateByBo(JdSaleReturnOrderBo bo) {
        JdSaleReturnOrder update = MapstructUtils.convert(bo, JdSaleReturnOrder.class);
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
    }

    /**
     * 保存前的数据校验
     */
    private void validEntityBeforeSave(JdSaleReturnOrder entity){
        //TODO 做一些数据校验,如唯一约束
    }

    /**
     * 校验并批量删除金蝶-销售退货单信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    @Override
    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
        if(isValid){
            //TODO 做一些业务上的校验,判断是否需要校验
        }
        return baseMapper.deleteByIds(ids) > 0;
    }

    /**
     * 查询金蝶-销售退货单列表所有数据
     *
     * @return 金蝶-销售退货单列表
     */
    @Override
    public List<JdSaleReturnOrder> queryAll() {
        return baseMapper.selectList(null);
    }

    /**
     * 清空金蝶-销售退货单列表所有数据
     *
     * @return 金蝶-销售退货单列表
     */
    @Override
    public Integer deleteAll() {
        return baseMapper.delete(new QueryWrapper<>());
    }

    /**
     * 查询金蝶-销售退货单列表
     * 场景分类：寄售-寄售换货-售后单(猫超售后店铺，进口猫超售后店铺)
     * 业务查询条件：根据sale_return_customer退货客户为猫超寄售售后、进口超市售后店铺货询
     *
     * @param bo
     * @param pageQuery
     */
    @Override
    public TableDataInfo<JdSaleReturnOrderVo> queryPageListBySaleReturnCustomer1(JdSaleReturnOrderBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<JdSaleReturnOrder> lqw = buildQueryWrapperBySaleReturnCustomer1(bo);
        Page<JdSaleReturnOrderVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }

    /**
     * 构建查询包装器
     * 该方法用于根据业务对象（bo）中的属性值生成一个LambdaQueryWrapper对象，这个对象后续用于数据库查询时的条件筛选
     * 主要用于销售退货单相关查询的条件构建
     * 场景分类：寄售-寄售换货-售后单(猫超售后店铺，进口猫超售后店铺)
     * 业务查询条件：根据sale_return_customer退货客户为猫超寄售售后、进口超市售后店铺货询
     *
     * @param bo 业务对象，包含查询条件相关的属性以及动态参数
     * @return LambdaQueryWrapper<JdSaleReturnOrder> 查询包装器对象，用于数据库查询时的条件构造
     */
    private LambdaQueryWrapper<JdSaleReturnOrder> buildQueryWrapperBySaleReturnCustomer1(JdSaleReturnOrderBo bo) {
        // 获取动态参数，用于处理额外的查询条件或配置
        Map<String, Object> params = bo.getParams();

        // 初始化LambdaQueryWrapper对象，用于构建查询条件
        LambdaQueryWrapper<JdSaleReturnOrder> lqw = Wrappers.lambdaQuery();

        // 以下为一系列查询条件的构建，只有当属性值不为空时，才会添加等于（eq）条件
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnOrderDate()), JdSaleReturnOrder::getSaleReturnOrderDate, bo.getSaleReturnOrderDate());
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnOrderNumber()), JdSaleReturnOrder::getSaleReturnOrderNumber, bo.getSaleReturnOrderNumber());
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnOrderStatus()), JdSaleReturnOrder::getSaleReturnOrderStatus, bo.getSaleReturnOrderStatus());
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnCustomer()), JdSaleReturnOrder::getSaleReturnCustomer, bo.getSaleReturnCustomer());
        lqw.eq(StringUtils.isNotBlank(bo.getInventoryOrganize()), JdSaleReturnOrder::getInventoryOrganize, bo.getInventoryOrganize());
        lqw.eq(StringUtils.isNotBlank(bo.getMaterialCode()), JdSaleReturnOrder::getMaterialCode, bo.getMaterialCode());

        // 当属性值不为空时，添加类似（like）条件，用于模糊查询
        lqw.like(StringUtils.isNotBlank(bo.getMaterialName()), JdSaleReturnOrder::getMaterialName, bo.getMaterialName());
        lqw.like(StringUtils.isNotBlank(bo.getInventoryUnitName()), JdSaleReturnOrder::getInventoryUnitName, bo.getInventoryUnitName());

        // 处理数值类型属性，只要属性值不为null，就添加等于（eq）条件
        lqw.eq(bo.getActualReturnNumber() != null, JdSaleReturnOrder::getActualReturnNumber, bo.getActualReturnNumber());

        // 继续处理其他字符串类型属性，添加等于（eq）或类似（like）条件
        lqw.eq(StringUtils.isNotBlank(bo.getReturnType()), JdSaleReturnOrder::getReturnType, bo.getReturnType());
        lqw.like(StringUtils.isNotBlank(bo.getWarehouseName()), JdSaleReturnOrder::getWarehouseName, bo.getWarehouseName());

        //
        lqw.in(CollUtil.isNotEmpty(bo.getSaleReturnCustomerList()), JdSaleReturnOrder::getSaleReturnCustomer, bo.getSaleReturnCustomerList());
        if (params.get("beginTime") != null && params.get("endTime") != null) {
            lqw.between(JdSaleReturnOrder::getNewOrderDate,
                params.get("beginTime"),
                params.get("endTime"));
        }
        lqw.eq(StringUtils.isNotBlank(bo.getSaleReturnOrderStatus()), JdSaleReturnOrder::getSaleReturnOrderStatus, "已审核");
        // 返回构建好的查询包装器对象
        return lqw;
    }



}
